<?php

class DocumentoController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //--------------------------------//
    //             PAGINA             //
    //--------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Documento.crear')) return;
    }

    public function editarAction()
    {
        if (X\CheckAccess::PageAction('Documento.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // obtener los datos
            $this->view->documento = $this->em->find('Default_Model_Documento', $id);
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar el documento.';
        }
    }

    public function listarAction()
    {
        if (X\CheckAccess::PageAction('Documento.listar')) return;

        try{

            // obtener los datos
            $documentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDocumento')
                    ->addselect      ('d.nombreDocumento')
                    ->from           ('Default_Model_Documento', 'd')
                    ->orderBy        ('d.nombreDocumento', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (15)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(d.codigoDocumento)')
                    ->from     ('Default_Model_Documento', 'd')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $documentos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los documentos.'.count($documentos);
        }
    }

    //--------------------------------//
    //              AJAX              //
    //--------------------------------//

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Documento.crear')) return;

        try{
            // obtener los parametros
            $nombreDocumento = $this->_request->getPost('nombreDocumento');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                ->select   ('count(d.codigoDocumento)')
                ->from     ('Default_Model_Documento', 'd')
                ->where    ("d.nombreDocumento='".pg_escape_string($nombreDocumento)."'")
                ->getQuery ()
                ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un documento con este nombre.');
                return;
            }

            // crear
            $documento = new Default_Model_Documento;
            $documento->setNombreDocumento($nombreDocumento);

            // guardar
            $this->em->persist($documento);
            $this->em->flush();

            X\Msg::Success('El documento se ha creado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el documento.');
        }
    }

    public function ajaxEditarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Documento.editar')) return;

        try{
            // obtener los parametros
            $codigoDocumento = $this->_request->getPost('codigoDocumento');
            $nombreDocumento = $this->_request->getPost('nombreDocumento');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(d.codigoDocumento)')
                    ->from     ('Default_Model_Documento', 'd')
                    ->where    ("d.nombreDocumento='".pg_escape_string($nombreDocumento)."'")
                    ->andWhere ("d.codigoDocumento<>'$codigoDocumento'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un documento con este nombre.');
                return;
            }

            // obtener y modificar el objeto
            $documento = $this->em->find('Default_Model_Documento', $codigoDocumento);
            $documento->setNombreDocumento($nombreDocumento);

            // guardar el objeto
            $this->em->persist($documento);
            $this->em->flush();

            X\Msg::Success('El documento se ha guardado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al guardar el documento.');
        }
    }

    public function ajaxEliminarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Documento.eliminar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getPost('id');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(c.codigoComprobante)')
                    ->from     ('Default_Model_Comprobante', 'c')
                    ->join     ('c.documento', 'd')
                    ->where    ("d.codigoDocumento='$id'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('El documento seleccionado está en uso.');
                return;
            }

            // obtener el objeto
            $documento = $this->em->find('Default_Model_Documento', $id);

            // guardar el objeto
            $this->em->remove($documento);
            $this->em->flush();

            X\Msg::Success('El documento se ha eliminado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar el documento.');
        }
    }

    public function ajaxListarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Documento.listar')) return;

        try{
            // obtener los parametros
            $start = $this->_request->getPost("start");
            $limit = $this->_request->getPost("limit");
            $sort  = $this->_request->getPost("sort");
            $dir   = $this->_request->getPost("dir");

            // parametros por defecto
            $sort = isset($sort)? $sort : 'nombreDocumento';
            $dir  = isset($dir)?  $dir  : 'asc';

            // obtener los datos
            $documentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDocumento')
                    ->addselect      ('d.nombreDocumento')
                    ->from           ('Default_Model_Documento', 'd')
                    ->orderBy        ("d.$sort", $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(d.codigoDocumento)')
                    ->from     ('Default_Model_Documento', 'd')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $documentos
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los documentos.'.$e->getMessage());
        }
    }
}